iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 15

<Day 15>attr_reader, attr_writer, attr_accessor

  • 分享至 

  • xImage
  •  

今天來聊聊 ruby 裡的 attr_accessor,為什麼我們要用 attr_accessor,假如你有一個類別裡面有實體變數,而你想要在外面也使用它們,那你要怎麼做呢?在這裡就必須要定義一個方法,因為只有方法能夠存取實體變數,那又是為什麼呢?因為你不這樣做的話會噴錯,就是這樣。

class User
  def initialize(name)
    @name = name
  end
end
person = User.new('ruby')
person.name

NoMethodError: undefined method `name` 

當沒有做好設定就要取用那個 person 的 name 就會產生這個錯誤NoMethodError ,那解決方法就是你定義一個自己的方法將是這樣:

class User
  def name
    @name
  end
end

#ruby

在其他物件導向的語言裡上面這個段叫做 getter 方法,你定義一個方法可以拿到實體變數的值,接下來你也許會想要改變這裡面的值,為了做到這件事情你就必須要有另一個方法,像是這個:

class User
  def name=(value)
    @name = value
  end
end

person.name = rails

想像你正在打開一個可以進入物件裡面並且修改物件的值的傳送門,這就是上面這段做的事情,既然都到這裡了,那有沒有正好的方法來定義這些方法勒?像是捷徑之類的。

答案是有的, attr_accessor 這不就來了!

你可以透過 attr_accessor 來告訴 ruby 來建立這些方法,如下:

class User
 attraccessor :name
 def initialize(name)
   @name = name
 end
end

現在看看下面這行,就是這段幫你建立另外兩個方法給你
attr_accessor :name
什麼方法勒?

name
name=

這不跟之前建立的方法一模一樣嗎?是的沒錯,但是這樣做的話你就不用把他們敲出來了,都說了這是個捷徑。

attr_accessor
attr_reader
attr_writer

他們之間有什麼不一樣的嗎?
attr_accessor 可以幫你建立 READER & WRITER 方法,attr_reader只會幫你建立 reader ,attr_writer 也只會幫你建立 writer ,換句話說,有了 attr_reader 你只能夠拿到值但是不能夠修改,而 attr_writer 能夠讓你修改值卻不能夠讀取值。

最後

有多個實體變數,想要定義多個屬性方法?
只要用對的語法,那你可以這樣做

attr_reader :name, :value, :ready?

用上面這個語法想做幾個就做幾個

以上


上一篇
<Day 14>在 rails 如何使用 Flash Messages
下一篇
<Day 16>怎麼使用 ruby 的 initialize 方法
系列文
今晚我想來點 Ruby on Rails 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言